/*************************************************
 *	文件名称：mydataexample.c
 *	文件说明：本代码为mydataexample.h的函数实现，需要
			  和mydataexample.h一起编译
 *	程序平台：for linux
 *	文件作者：Jason <jasonsunsoft@163.com>
 *	文件时间：2014年9月5日 21:32
*************************************************/
#include <stdio.h>
#include "mydata.h"

//初始条件：
//操作结果：构造一个空栈S
Status InitStack(SqStack *S)
{
	S->base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (S->base)
	{
		S->top = S->base;
		S->stacksize = STACK_INIT_SIZE;
		return OK;
	}

	else
	{
		S->base = S->top = NULL;
		S->stacksize = 0;
		return ERROR;
	}

}

//初始条件：栈S已存在
//操作结果：栈S被销毁
Status DestroyStack(SqStack *S)
{
	if (S->base == NULL)
		return ERROR;
	free(S->base);
	S->top = S->base = NULL;
	S->stacksize = 0;
	return OK;
}

//初始条件：栈S已存在
//操作结果：将S清空
Status ClearStack(SqStack *S)
{
	if (S->base == NULL)
		return ERROR;
	S->top = S->base;
	return OK;
}

//初始条件：栈S已存在
//操作结果：若栈S为空栈，则返回TRUE，否则返回FALSE
Status StackEmpty(SqStack S)
{
	if (S.base == S.top)
		return TRUE;
	else
		return FALSE;
}

//初始条件：栈S已存在
//操作结果：返回S的元素个数，即栈的长度。
int StackLength(SqStack S)
{
	return (S.top - S.base);
}

//初始条件：栈S已存在且非空
//操作结果：用e返回S的栈顶元素
Status GetTop(SqStack S, SElemType *e)
{
	if (S.base == S.top)
	{
		e = NULL;
		return ERROR;
	}
	else
	{
		*e = *(S.top - 1);
		return OK;
	}
}

//初始条件：栈S已存在
//操作结果：插入元素e为新的栈顶元素
Status Push(SqStack *S, SElemType e)
{
	if (StackLength(*S) >= S->stacksize)
	{
		S->base = (SElemType *) realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
		if(!S->base)
			exit(OVERFLOW);		//内存分配失败
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*(S->top) = e;
	++ S->top;
	return OK;
}

//初始条件：栈S已存在且非空
//操作结果：删除S的栈顶元素，并用e返回其值。
Status Pop(SqStack *S, SElemType *e)
{
	if (S->top == S->base)
		return ERROR;
	*e = *(-- S->top);
	return OK;
}

//初始条件：栈S已存在且非空
//操作结果：从栈底到栈顶依次对S的每个数据元素调用visit（）。一旦visit（）失败，则操作失败。
Status StackTraverse(SqStack S,Status (*visit)(SElemType))
{
	SElemType *ptemp;
	ptemp = S.base;
	printf("Stack is");
	while(ptemp != S.top)
	{
		if (!visit(*ptemp))
			return ERROR;
		++ ptemp;
	}
	printf("\n");
	return OK;
}

Status PriStack(SElemType e)
{
	printf(" %d", e);
	return OK;
}
